package com.wondersgroup.fjzlpt.org.service.impl.jtqy;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.quick.framework.boot.remoteResult.ResultObject;
import com.quick.framework.util.FormatDate;
import com.quick.framework.util.LoggerUtil;
import com.wondersgroup.fjzlpt.org.dao.inter.fwb.FwbDAO;
import com.wondersgroup.fjzlpt.org.dao.inter.hzgl.FpfwDao;
import com.wondersgroup.fjzlpt.org.dao.inter.jtqy.*;
import com.wondersgroup.fjzlpt.org.dao.inter.yljgry.YljgryDAO;
import com.wondersgroup.fjzlpt.org.service.inter.jtqy.JtqyApiService;
import com.wondersgroup.fjzlpt.org.util.ControllerCommonUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thymeleaf.util.StringUtils;
import sun.swing.StringUIClientPropertyKey;

import java.util.*;

@Service
public class JtqyApiServiceImpl implements JtqyApiService {

    @Autowired
    private JmxxDAO jmxxDao;
    @Autowired
    private QyxxDAO qyxxDao;
    @Autowired
    private FwbDAO fwbDao;
    @Autowired
    private FpfwDao fpfwDao;
    @Autowired
    private YljgryDAO yljgryDAO;

    private static Map<String , String> fromSystem = new HashMap<String , String >();

    static {
        fromSystem.put("01" , "公卫");
        fromSystem.put("02" , "HIS");
        fromSystem.put("03" , "诊疗辅助系统");
    }

    /**
     * 第三方家签数据校验接口
     * @param body
     * @return
     */
    @Override
    public JSONObject validateQyxx(JSONObject body) {
        /**
         * 1.数据来源为"健康档案"且库中有该身份证号的数据，则更新；
         * 2.数据来源为"his系统"且库中有该身份证号的数据，则以库为主；
         * 3.库中无数据，插入居民数据
         */
        ResultObject ro = new ResultObject();
        //step 1 : 判断数据来源
        String fromSystem = body.getString("fromSystem");  //数据来源(01：健康档案，02：his系统)
        if(org.apache.commons.lang.StringUtils.isEmpty(fromSystem) || "01,02".indexOf(fromSystem) == -1){
            ro.changeFaultState("未知数据来源！");
            return JSONObject.parseObject(ro.toJsonStr());
        }

        JSONObject jsonObject = body.getJSONObject("doctor");
        Map map = JSON.toJavaObject(jsonObject, Map.class);
        JSONObject isExistYs = qyxxDao.isExistYs(map);

        //step 2 : 判断医生信息是否真确
        if (isExistYs.isEmpty()) {
            ro.changeFaultState("签约平台不存在该医疗机构医生信息！");
            return JSONObject.parseObject(ro.toJsonStr());
        }
        JSONObject hzJson = body.getJSONObject("patient");
        StringBuffer RQFL = new StringBuffer();
        JSONArray rqflArr = hzJson.getJSONArray("rqfl");
//        JSONArray rqflArr = JSONArray.parseArray(hzJson.getString("rqfl"));
        if(rqflArr != null && rqflArr.size() > 0 ){
            for(int i=0;i<rqflArr.size();i++){
                RQFL.append(rqflArr.getString(i)+",");
            }
            RQFL.deleteCharAt(RQFL.length()-1);
        }
        String params = "PTJGID=" + isExistYs.getString("PTJGID") +
                "&USERID=" + isExistYs.getString("USERID") +
                "&ZJHM=" + hzJson.getString("sfzh") +
                "&fromSystem=" + fromSystem +
                "&RQFL=" + RQFL.toString();

        //step 3 : 判断患者是否还在签约中
        Set<String> set = hzJson.keySet();
        Map<String, Object> jmxxMap = new HashMap();
        for (String key : set) {
            Object value = hzJson.get(key);
            String newKey = key.toUpperCase();
            if (newKey.equals("SFZH")) {
                newKey = "ZJHM";
            }else if (newKey.equals("JTDZ")) {
                newKey = "JTZZ";
            }else if (newKey.equals("CSRQ")) {
                value = FormatDate.getDateY_M_D((String)value);
            }
            jmxxMap.put(newKey, value);
        }
        Map hzmap = JSON.toJavaObject(hzJson, Map.class);
        hzmap.put("QYLX","01,02");
        hzmap.put("ZJHM",hzmap.get("sfzh"));
        JSONArray qyxxArr = qyxxDao.queryAllOnView(hzmap);
        String JMXXID = null;
        if (qyxxArr.size()>0) {
            JSONObject item = qyxxArr.getJSONObject(0);
            if(!isExistYs.get("XZQHDM").equals(item.getString("XZQHDM"))){ //是否跨区
                StringBuffer tipBuf = new StringBuffer();
                tipBuf.append("该居民已在")
                        .append(item.getString("XZQHMC")) //xx区
                        .append(item.getString("YLJGMC")) //xx机构
                        .append("签约，暂不允许进行跨区签约！");
                ro.changeFaultState(tipBuf.toString());
            }else{
                JMXXID = item.getString("JMXXID");
                if("02".equals(fromSystem)){
                    jmxxMap.put("JMXXID", JMXXID);
                    //this.insertBacthRqfl(JMXXID,hzJson.getJSONArray("rqfl"));
                    jmxxDao.updateForPrimaryKey(jmxxMap);
                }
                params += "&JMXXID=" + JMXXID;
                ro.setInfo("url", ControllerCommonUtil.getJtqyApiUrl() + params);
            }
            return JSONObject.parseObject(ro.toJsonStr());
        }

        //step 3 : 判断居民表是否存在该患者信息
        try {
            /*居民信息操作*/
//            Map<String, Object> hzmap = hzJson;

            Map<String,String> jmQuery = new HashMap<>();
            jmQuery.put("ZJHM",hzmap.get("ZJHM").toString());
            JSONObject jmxxObj = jmxxDao.queryOne(jmQuery);
            JMXXID = jmxxObj.getString("JMXXID");
            //居民是否存在
            if(jmxxObj.isEmpty()){
                JMXXID = UUID.randomUUID().toString();
                jmxxMap.put("JMXXID", JMXXID);
                //this.insertBacthRqfl(JMXXID,hzJson.getJSONArray("rqfl"));
                jmxxDao.insert(jmxxMap);
            }else if("02".equals(fromSystem)){
                jmxxMap.put("JMXXID", JMXXID);
                //this.insertBacthRqfl(JMXXID,hzJson.getJSONArray("rqfl"));
                jmxxDao.updateForPrimaryKey(jmxxMap);
            }

            //数据返回
            params += "&JMXXID=" + JMXXID;
            ro.setInfo("url", ControllerCommonUtil.getJtqyApiUrl() + params);
        }catch (Exception e) {
            e.printStackTrace();
            ro.changeFaultState("患者信息校验不通过！");
        }
        return JSONObject.parseObject(ro.toJsonStr());
    }

    /**
     * 第三方接口：使用身份证号查询签约状态信息
     * @param sfzh 身份证号
     * @return
     */
    @Override
    public JSONObject getQyxxInfo(String sfzh) {
        JSONObject jo = new JSONObject();
        JSONObject obj = qyxxDao.getQyxxInfo(sfzh);
        jo.put("state" , "true");
        if(obj.isEmpty()){
            jo.put("state", "false");
            jo.put("faultInfo","没有该人员的签约信息！");
        }else{
            jo.put("qyxx",obj);
        }
        return jo;
    }

    /**
     * 第三方接口：使用身份证号查询签约服务包费用信息
     * @param sfzh 身份证号
     * @return
     */
    @Override
    public JSONObject getQyfyxxInfo(String sfzh) {
        JSONObject jo = new JSONObject();
        jo.put("state" , "true");
        JSONArray ary = qyxxDao.getQyfyxxInfo(sfzh);
        if(ary.size() > 0){
            jo.put("qyxx",ary);
        }else{
            jo.put("state" , "false");
            jo.put("faultInfo" , "该人员没有签约信息！");
        }
        return jo;
    }

    /**
     * 第三方接口：传入签约信息修改该签约信息为已收费
     * @param qyxx 签约信息
     * @return
     */
    @Override
    public JSONObject updateQyfyxx(JSONObject qyxx) {
        ResultObject ro = new ResultObject();
        try {
            Map map = JSONObject.toJavaObject(qyxx, Map.class);
            boolean flg = qyxxDao.isExistSf(map);
            if(flg){
                map.put("SFBS" , "1");
                qyxxDao.updateForPrimaryKey(map);
            }else{
                ro.changeFaultState("未查到记录，或该记录已收费。");
            }
        }catch (Exception e){
            LoggerUtil.error(e.getMessage());
            ro.changeFaultState("接口异常，请联系管理员！");
        }
        return JSONObject.parseObject(ro.toJsonStr());
    }


    /**
     * 第三方接口：完成服务
     * @param qyxx 签约信息
     * @return
     */
    public JSONObject finishTask(JSONObject qyxx){
        ResultObject ro = new ResultObject();
        try {
            //step 1 : 根据“医生身份证号”查询USERID
            Map map = qyxx;
            JSONObject ysObj = null;

            String ysSfzh = qyxx.getString("YSSFZH"); //医生身份证号
            Map<String,String> queryYsObj = new HashMap<String,String>();
            queryYsObj.put("SFZH",ysSfzh);
            queryYsObj.put("QYXXID",qyxx.getString("QYXXID"));
            if(StringUtils.isEmpty(ysSfzh)){
                ro.changeFaultState("缺少医生身份证号");
            }else{
                ysObj = yljgryDAO.queryUserXx(queryYsObj); //查询医生信息
                map.put("USERID",ysObj.getString("USERID"));
                if(ysObj.isEmpty()){
                    ro.changeFaultState("身份证号没有对应医生");
                }else if(qyxxDao.isTdcyByQyxxAndUserid(queryYsObj)){
                    //step 2 : 根据“USERID"与“签约信息ID”查询该医生是否是 签约团队的团队成员
                    ro.changeFaultState("医生不是签约团队成员");
                }
            }

            //step 3 : 校验通过：可以完成任务
            if(ro.isState()){
                Date nowDate = new Date();
                qyxx.put("XZSJ", nowDate); //新增时间
                qyxx.put("XGSJ", nowDate); //修改时间
                qyxx.put("FPFWID", UUID.randomUUID().toString());
                qyxx.put("USERID", ysObj.getString("USERID")); //服务人员
                qyxx.put("SJFWRYID",ysObj.getString("USERID")); //实际服务人员
                qyxx.put("FWZT","1"); //服务状态:完成

                qyxx.put("YQFWSJ",FormatDate.getDateY_M_D(qyxx.getString("YQFWSJ"))); //预期服务时间
                qyxx.put("SJFWSJ",FormatDate.getDateY_M_D(qyxx.getString("SJFWSJ"))); //实际服务时间
                String fwbz = qyxx.getString("BZ");
                String system = qyxx.getString("FROMSYSTEM");
                if(!StringUtils.isEmpty(system)){
                    fwbz = "服务项履约记录来源于【" + fromSystem.get(system) +  "】系统 ：" + fwbz;
                }
                qyxx.put("BZ" , fwbz);
                fpfwDao.insert(qyxx);
            }
        }catch (Exception e){
            LoggerUtil.error(e.getMessage());
            ro.changeFaultState("完成服务失败！");
        }

        return (JSONObject) JSON.toJSON(ro);
    }
}
